<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /**
     * https://leetcode-cn.com/problems/minimum-size-subarray-sum/
     * https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/jin-tian-mei-tu-yi-dong-chuang-kou-xian-zhao-dao-y/
     * 思路：
     * ● 连续子数组可以表示为 [i,j]：从第 i 项到第 j 项。
     * ● 当 [i,j] 子数组和 >= s，如果此时扩张窗口，条件依然满足，但背离“最小长度”的要求。
     *   ● 所以选择收缩窗口，i 右移，直到条件不再满足（这里是一个循环），这是在优化可行解，
     *     并让窗口长度挑战最小纪录。
     * ● 当窗口的和 < s，此时应该扩张窗口，j 右移，直到条件重新满足。
     *
     * 总结：
     * ● 扩张窗口：为了找到一个可行解，找到了就不再扩张
     * ● 收缩窗口：在长度上优化该可行解，直到条件被破坏
     * ● 寻找下一个可行解，然后再优化到不能优化……
     */
    let s = 7;
    const nums = [2,3,1,2,4,3];

    function minSubArrayLen(s, nums) {
      let i = 0, j = 0;
      let minLen = Infinity;
      sum = 0;

      while (j < nums.length) { // 主旋律是扩张，找可行解
        sum += nums[j];
        while (sum >= s) { // 间歇性收缩，优化可行解
          sum -= nums[i];
          minLen = Math.min(minLen, j - i + 1);
          i++;
        }
        j++;
      }
      return minLen === Infinity ? 0 : minLen // 从未找到可行解，返回0
    }
    console.log(minSubArrayLen(s, nums));
  </script>
</body>
</html>